package app

import (
	"fmt"
	"github.com/BurntSushi/toml"
)

/** =========== Mysql 结构 =========== */
type DbConfig struct {
	DbSource      string `toml:"db_source"`
	DbPrefix      string `toml:"db_prefix"`
	DbShowSql     bool   `toml:"db_show_sql"`
	TimeZone      string `toml:"time_zone"`
	DbMaxOpenConn int    `toml:"db_max_open_conn"`
	DbMaxIdleConn int    `toml:"db_max_idle_conn"`
}

/** =========== Redis 结构 =========== */
type RedisConfig struct {
	RedisHost     string `toml:"redis_host"`
	RedisPassword string `toml:"redis_password"`
	RedisPort     int64  `toml:"redis_port"`
}

/** =========== 日志 结构 =========== */
type LogConfig struct {
	LogFileDir  string `toml:"log_file_dir"`
	LogFilePath string `toml:"log_file_path"`
	LogFileName string `toml:"log_file_name"`
	LogFileType string `toml:"log_file_type"`
}

/** =========== 图片 结构 =========== */
type ImageConfig struct {
	ImageStaticDomain string `toml:"image_static_domain"`
	ImageUploadDir    string `toml:"image_upload_dir"`
}

/** =========== Jwt 结构 =========== */
type JwtConfig struct {
	TokenExpireHour int64  `toml:"token_expire_hour"`
	TokenKey        string `toml:"token_key"`
	TokenIssuer     string `toml:"token_issuer"`
}

/** =========== 环境 结构 =========== */
type EnvConfig struct {
	AppEnv string `toml:"app_env"`
}

type MainConfig struct {
	AppMode      string   `toml:"app_mode"`
	AppEnv       string   `toml:"app_env"`
	AppUrl       string   `toml:"app_url"`
	AppDebug     bool     `toml:"app_debug"`
	CryptAesKey  string   `toml:"crypt_aes_key"`
	DefaultLang  string   `toml:"default_lang"`
	DbPrefix     string   `toml:"db_prefix"`
	MachineId    string   `toml:"machine_id"`
	AdminDomain  []string `toml:"admin_domain"`
	Mysql        map[string]*DbConfig
	RedisCache   *RedisConfig   `toml:"redis_cache"`
	RedisLocker  []*RedisConfig `toml:"redis_locker"`
	RedisCluster []*RedisConfig `toml:"redis_cluster"`
	Log          map[string]*LogConfig
	Image        *ImageConfig
	Jwt          map[string]*JwtConfig
}

// 所有的配置文件从这里获取
var Config MainConfig

// 初始化配置文件
func InitTomlConfig() error {
	envPath := BasePath + "/config/env.toml"

	// 读取当前运行环境
	var envConfig EnvConfig
	if _, err := toml.DecodeFile(envPath, &envConfig); err != nil {
		return err
	}

	// 读取所有配置
	configDir := BasePath + "/config/" + envConfig.AppEnv
	if _, err := toml.DecodeFile(configDir+"/config.toml", &Config); err != nil {
		return err
	}

	// 合并
	Config.AppEnv = envConfig.AppEnv
	return nil
}

// 获取 数据库 名前缀
func (mc MainConfig) GetDbPrefix() string {
	if mc.DbPrefix != "" {
		return mc.DbPrefix
	}

	return "jesus"
}

// @title GetDbConfig
// @description 获取数据库的配置
func (mc MainConfig) GetDbConfig(conn string) (*DbConfig, error) {

	if _, ok := mc.Mysql[conn]; !ok {
		return nil, fmt.Errorf("数据库初始化失败 --- 不存在的配置区")
	}

	config := mc.Mysql[conn]
	config.DbPrefix = mc.DbPrefix

	return config, nil
}

// @title GetRedisCacheConfig
// @description 获取 redis cache 的配置
func (mc MainConfig) GetRedisCacheConfig() (*RedisConfig, error) {
	fmt.Println(mc.RedisCache)
	if mc.RedisCache == nil {
		return nil, fmt.Errorf("redis 初始化失败---不存在 连接项 -- -- locker")
	}

	return mc.RedisCache, nil
}

// @title GetRedisClusterConfig
// @description 获取 redis cluster 的配置
func (mc MainConfig) GetRedisClusterConfig() ([]*RedisConfig, error) {
	if len(mc.RedisCluster) == 0 {
		return nil, fmt.Errorf("redis 初始化失败---不存在 连接项 -- -- locker")
	}

	return mc.RedisCluster, nil
}

// @title GetRedisLockerConfig
// @description 获取 redis cluster 的配置
func (mc MainConfig) GetRedisLockerConfig() ([]*RedisConfig, error) {
	if len(mc.RedisLocker) == 0 {
		return nil, fmt.Errorf("redis 初始化失败---不存在 连接项 -- -- locker")
	}

	return mc.RedisLocker, nil
}

// 获取 Log 配置
func (mc MainConfig) GetLogConfig(conn string) (*LogConfig, error) {
	if _, ok := mc.Log[conn]; !ok {
		return nil, fmt.Errorf("log初始化失败---不存在的配置")
	}

	return mc.Log[conn], nil
}

// 获取 Image 配置
func (mc MainConfig) GetImageConfig() *ImageConfig {
	return mc.Image
}

// 获取 Jwt 配置
func (mc MainConfig) GetJwtConfig(conn string) (*JwtConfig, error) {
	if _, ok := mc.Jwt[conn]; !ok {
		return nil, fmt.Errorf("jwt初始化失败---不存在的配置")
	}

	return mc.Jwt[conn], nil
}

// 获取所有的管理端域名
func (mc MainConfig) GetAdminDomain() []string {
	return mc.AdminDomain
}

// 判断是否是管理端域名
func (mc MainConfig) IsAdminDomain(host string) bool {
	if host == "" {
		return false
	}

	for _, domain := range mc.AdminDomain {
		if domain == host {
			return true
		}
	}
	return false
}
